package db

import "fmt"

// Go 语言使用以下三个方法实现 MySQL 中的事务操作
// func (db *DB) Begin() (*Tx, error)  // 开始事务
// func (tx *Tx) Commit() error  // 提交事务
// func (tx *Tx) Rollback() error   // 回滚事务

// TransactionDemo 事务操作
func TransactionDemo() {
	tx, err := Db.Begin() // 开始事务
	if err != nil {
		if tx != nil {
			tx.Rollback() // 回滚
		}
		fmt.Printf("begin trans failed, err: %v\n", err)
		return
	}

	sqlStr1 := "Update db_user set age=30 where id=?"
	ret1, err := tx.Exec(sqlStr1, 2)
	if err != nil {
		tx.Rollback() // 回滚
		fmt.Printf("exec sql1 failed, err: %v\n", err)
		return
	}
	affRow1, err := ret1.RowsAffected()
	if err != nil {
		tx.Rollback() // 回滚
		fmt.Printf("exec ret1.RowsAffected() failed, err: %v\n", err)
		return
	}

	sqlStr2 := "Update db_user set age=4 where id=?"
	ret2, err := tx.Exec(sqlStr2, 3)
	if err != nil {
		tx.Rollback() // 回滚
		fmt.Printf("exec sql2 failed, err: %v\n", err)
		return
	}
	affRow2, err := ret2.RowsAffected()
	if err != nil {
		tx.Rollback() // 回滚
		fmt.Printf("exec ret1.RowsAffected() failed, err: %v\n", err)
		return
	}

	fmt.Println(affRow1, affRow2)
	if affRow1 == 1 && affRow2 == 1 {
		fmt.Println("事务提交了...")
		tx.Commit() // 提交事务
	} else {
		tx.Rollback()
		fmt.Println("事务回滚了...")
	}
	fmt.Println("exec trans success!")

}
